.\" Copyright (c) 2007-2008 Roy Marples
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd Mar 16, 2008
.Dt RC_SERVICE 3 SMM
.Os OpenRC
.Sh NAME
.Nm rc_service_add , rc_service_delete , rc_service_daemon_set ,
.Nm rc_service_description , rc_service_exists , rc_service_in_runlevel ,
.Nm rc_service_mark , rc_service_extra_commands , rc_service_plugable ,
.Nm rc_service_resolve , rc_service_schedule_start , rc_services_scheduled_by ,
.Nm rc_service_schedule_clear , rc_service_state ,
.Nm rc_service_started_daemon , rc_service_value_get , rc_service_value_set ,
.Nm rc_services_in_runlevel , rc_services_in_state , rc_services_scheduled ,
.Nm rc_service_daemons_crashed
.Nd functions to query OpenRC services
.Sh LIBRARY
Run Command library (librc, -lrc)
.Sh SYNOPSIS
.In rc.h
.Ft bool Fn rc_service_add "const char *runlevel" "const char *service"
.Ft bool Fn rc_service_delete "const char *runlevel" "const char *service"
.Ft bool Fo rc_service_daemon_set
.Fa "const char *service"
.Fa "const char *exec"
.Fa "const char *name"
.Fa "const char *pidfile"
.Fa "bool started"
.Fc
.Ft "char *" Fo rc_service_description
.Fa "const char *service"
.Fa "const char *option"
.Fc
.Ft bool Fn rc_service_exists "const char *service"
.Ft bool Fn rc_service_in_runlevel "const char *service" "const char *runlevel"
.Ft bool Fn rc_service_mark "const char *service" "RC_SERVICE state"
.Ft "RC_STRINGLIST *" Fn rc_service_extra_commands "const char *service"
.Ft bool Fn rc_service_plugable "const char *service"
.Ft "char *" rc_service_resolve "const char *service"
.Ft bool Fo rc_service_schedule_start
.Fa "const char *service"
.Fa "const char *service_to_start"
.Fc
.Ft "RC_STRINGLIST *" Fn rc_services_scheduled_by "const char *service"
.Ft bool Fn rc_service_schedule_clear "const char *service"
.Ft RC_SERVICE Fn rc_service_state "const char *service"
.Ft bool Fo rc_service_started_daemon
.Fa "const char *service"
.Fa "const char *exec"
.Fa "int indx"
.Fc
.Ft "char *" Fn rc_service_value_get "const char *service" "const char *option"
.Ft bool Fo rc_service_value_set
.Fa "const char *service"
.Fa "const char *option"
.Fa "const char *value"
.Fc
.Ft "RC_STRINGLIST *" Fn rc_services_in_runlevel "const char *runlevel"
.Ft "RC_STRINGLIST *" Fn rc_services_in_state "RC_SERVICE state"
.Ft "RC_STRINGLIST *" Fn rc_services_scheduled "const char *service"
.Ft bool Fn rc_service_daemons_crashed "const char *service"
.Sh DESCRIPTION
These functions provide a means of querying OpenRC services to find out the
state of each one, to start and stop it, and any other functions related
to it.
.Pp
Most functions should be self descriptive as to what they do and what they
return based on names and arguments.
.Pp
.Fn rc_service_add
adds the
.Fa service
to the
.Fa runlevel .
.Pp
.Fn rc_service_delete
deletes the
.Fa service
from the
.Fa runlevel .
.Pp
.Fn rc_service_daemon_set
saves the arguments in the
.Fa service
state data so that
.Fn rc_service_daemons_crashed
can check to see if they are still running or not.
.Pp
.Fn rc_service_description
returns the
.Va description
variable of the
.Fa service .
If
.Fa option
is not null then we return the
.Fa description_$option
variable instead.
.Pp
.Fn rc_service_exists
returns true if the
.Fa service
exists, otherwise false.
.Pp
.Fn rc_service_in_runlevel
returns true if the
.Fa service
is in the
.Fa runlevel ,
otherwise false.
.Pp
.Fn rc_service_mark
puts the
.Fa service
into the given
.Fa state .
If the state is RC_SERVICE_STOPPED then all data associated with the
.Fa service
is lost.
.Fn rc_service_extra_commands
returns a list of extra commands the
.Fa service
supports beyond the default ones. See
.Nm openrc-run
for default commands.
.Pp
.Fn rc_service_plugable
returns true if the service is allowed to be plugged by
.Pa rc.conf .
Default is true.
.Pp
.Fn rc_service_resolve
resolves
.Fa service
to the full path of service that was started, or would be started.
.Pp
When
.Fa service
starts, it starts
.Fa service_to_start
afterswards as directed by
.Fn rc_service_schedule_start .
.Fn rc_services_scheduled
returns a list of services that will be started when
.Fa service
starts.
.Fn rc_service_schedule_clear
clears these scheduled services for
.Fa service .
.Pp
.Fn rc_service_state returns the state of
.Fa service .
The return value is a bitmask, where more than one state can apply.
.Pp
.Fn rc_service_started_daemon
checks to see if
.Fa service
started
.Fa exec
using
.Nm start-stop-daemon .
If
.Fa indx
is greater than zero, then it must also be the nth daemon started by
.Fa service .
.Fn rc_service_value_set
saves the
.Fa value
under the name
.Fa option .
.Fn rc_service_value_get
returns the value of the saved
.Fa option .
.Pp
.Fn rc_services_in_runlevel
returns a list of services in
.Fa runlevel .
If
.Fa runlevel
is not specified, then it returns a list of all available services.
.Pp
.Fn rc_services_in_state
returns a list of all the services in
.Fa state .
.Sh IMPLEMENTATION NOTES
Each function that returns
.Fr "char *"
returns a malloced NULL terminated string that should be freed when done.
.Pp
Each function that returns
.Fr "RC_STRINGLIST *"
should be freed using
.Fn rc_stringlist_free
when done.
.Pp
When a function fails it should either return false or NULL and set
.Va errno
unless specified otherwise as above.
.Sh FILES
.Pa /lib/rc/init.d
normally holds the volatile state data for services on a RAM backed disk.
.Sh SEE ALSO
.Xr errno 3 ,
.Xr malloc 3 ,
.Xr free 3
.Xr rc_stringlist_free 3 ,
.Xr start-stop-daemon 8
.Sh AUTHORS
.An Roy Marples <roy@marples.name>
